import { ELoading } from ':/const/status';
import { createSelice } from '../utils/epicSeliceUtils';

/**
 * 命名空间
 */
export const USER_STATE_NAMESPACE = 'user';

/**
 * 用户信息
 */
export interface IUser {
  username?: string;
  token?: string;
}

/**
 * 用户登录参数
 */
export interface ILoginParam {
  username: string;
  password: string;
}

/**
 * 用户登录处理函数
 * @param 用户登录参数
 * @returns 用户登录请求结果
 */
function userLogin({ username }: ILoginParam): Promise<IUser> {
  return new Promise((resolve, reject) => {
    // 去发起请求，可以是异步的
    setTimeout(() => {
      resolve({ username, token: Math.random().toString() });
    }, 3000);
  });
}

/**
 * 快速创建一个 User Selice 并导出
 */
export const {
  reducer: userReducer,
  epic: userEpic,
  actions: {
    toDoActionCreater: login
  },
  selectors: userSelector
} = createSelice<IUser>({
  namespace: USER_STATE_NAMESPACE,
  handler: userLogin,
  initState: { loading: ELoading.IDLE }
});
